#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int SmartMove (char field[3][3], char mansimbol, char compsimbol) {
    //проверить, есть ли 2 в ряд
    // если да - закрыть третье место
   if (((field[0][1] == field[0][2]) || (field[0][1] == field[0][0]) || (field[0][0] == field[0][2])) && ((field[0][2] == mansimbol) || (field[0][0] == mansimbol))) {
        if (field[0][0] == ' ') {
            field[0][0] = compsimbol;
            return compsimbol;
        }
        if (field[0][1] == ' ') {
            field[0][1] = compsimbol;
            return compsimbol;
        }
        if (field[0][2] == ' ') {
            field[0][2] = compsimbol;
            return compsimbol;
        }

    } 
    

    if (((field[1][1] == field[1][2]) || (field[1][1] == field[1][0]) || (field[1][0] == field[1][2])) && ((field[1][2] == mansimbol) || (field[1][0] ==  mansimbol))) {
        if (field[1][0] == ' ') {
            field[1][0] = compsimbol;
            return compsimbol;
        }
        if (field[1][1] == ' ') {
            field[1][1] = compsimbol;
            return compsimbol;
        }
        if (field[1][2] == ' ') {
            field[1][2] = compsimbol;
            return compsimbol;
        }
    }
    if (((field[2][1] ==  field[2][2]) || (field[2][1] ==  field[2][0]) || (field[2][0] ==  field[2][2])) && ((field[2][2] ==  mansimbol) || (field[2][0] ==  mansimbol))) {
        if (field[2][0] == ' ') {
            field[2][0] = compsimbol;
            return compsimbol;
        }
        if (field[2][1] == ' ') {
            field[2][1] = compsimbol;
            return compsimbol;
        }
        if (field[2][2] == ' ') {
            field[2][2] = compsimbol;
            return compsimbol;
        }
    } //Проверили все строки


    if (((field[0][0] == field[1][0]) || (field[0][0] == field[2][0]) || (field[1][0] == field[2][0])) &&((field[1][0] == mansimbol) || (field[2][0] == mansimbol))) {
        if (field[0][0] == ' ') {
            field[0][0] = compsimbol;
            return compsimbol;
        }
        if (field[1][0] == ' ') {
            field[1][0] = compsimbol;
            return compsimbol;
        }
        if (field[2][0] == ' ') {
            field[2][0] = compsimbol;
            return compsimbol;
        }
    }
    if (((field[0][1] == field[1][1]) || (field[0][1] == field[2][1]) || (field[1][1] == field[2][1])) &&((field[1][1] == mansimbol) || (field[2][1] == mansimbol))) {
        if (field[0][1] == ' ') {
            field[0][1] = compsimbol;
            return compsimbol;
        }
        if (field[1][1] == ' ') {
            field[1][1] = compsimbol;
            return compsimbol;
        }
        if (field[2][1] == ' ') {
            field[2][1] = compsimbol;
            return compsimbol;
        }
    }
    if (((field[0][2] == field[1][2]) || (field[0][2] == field[2][2]) || (field[1][2] == field[2][2])) &&((field[1][2] == mansimbol) || (field[2][2] == mansimbol))) {
        if (field[0][2] == ' ') {
            field[0][2] = compsimbol;
            return compsimbol;
        }
        if (field[1][2] == ' ') {
            field[1][2] = compsimbol;
            return compsimbol;
        }
        if (field[2][2] == ' ') {
            field[2][2] = compsimbol;
            return compsimbol;
        }
    }//Проверили все столбцы

    if (((field[0][0] == field[1][1]) || (field[0][0] == field[2][2]) || (field[1][1] == field[2][2])) && ((field[0][0] == mansimbol) || (field[1][1] == mansimbol))) {
        if (field[0][0] == ' ') {
            field[0][0] = compsimbol;
            return compsimbol;
        } 
        if (field[1][1] == ' ') {
            field[1][1] = compsimbol;
            return compsimbol;
        }
        if (field[2][2] == ' ') {
            field[2][2] = compsimbol;
            return compsimbol;
        }
    }//Проверили левую диагональ

    if (((field[0][2] == field[1][1]) || (field[0][2] == field[2][0]) || (field[1][1] == field[2][0])) && ((field[0][2] == mansimbol) || (field[1][1] == mansimbol))) {
        if (field[0][2] == ' ') {
            field[0][2] = compsimbol;
            return compsimbol;
        } 
        if (field[1][1] == ' ') {
            field[1][1] = compsimbol;
            return compsimbol;
        }
        if (field[2][0] == ' ') {
            field[2][0] = compsimbol;
            return compsimbol;
        }
        
        }


    //Проверили правую диагональ
    // если нет начинаем атаковать
    //Алгоритм атаки:
        // у нас есть два в ряд? Если да, то ставим третий
        if (((field[0][1] ==  field[0][2]) || (field[0][1] ==  field[0][0]) || (field[0][0] ==  field[0][2])) && ((field[0][2] ==  compsimbol) ||(field[0][0] ==  compsimbol))) {
            if (field[0][0] == ' ') {
                field[0][0] = compsimbol;
                return compsimbol;
            }
            if (field[0][1] == ' ') {
                field[0][1] = compsimbol;
                return compsimbol;
            }
            if (field[0][2] == ' ') {
                field[0][2] = compsimbol;
                return compsimbol;
            }
        } 
        if (((field[1][1] == field[1][2]) || (field[1][1] == field[1][0]) || (field[1][0] == field[1][2])) && ((field[1][2] == compsimbol) || (field[1][0] == compsimbol))) {
            if (field[1][0] == ' ') {
                field[1][0] = compsimbol;
            return compsimbol;
            }
            if (field[1][1] == ' ') {
                field[1][1] = compsimbol;
            return compsimbol;
            }
            if (field[1][2] == ' ') {
                field[1][2] = compsimbol;
            return compsimbol;
            }
        }
        if (((field[2][1] == field[2][2]) || (field[2][1] == field[2][0]) || (field[2][0] == field[2][2])) && ((field[2][2] == compsimbol) || (field[2][0] == compsimbol))) {
            if (field[2][0] == ' ') {
                field[2][0] = compsimbol;
                return compsimbol;
            }
            if (field[2][1] == ' ') {
                field[2][1] = compsimbol;
                return compsimbol;
            }
            if (field[2][2] == ' ') {
                field[2][2] = compsimbol;
                return compsimbol;
            }
        } //Проверили все строки

        if (((field[0][0] == field[1][0]) || (field[0][0] == field[2][0]) || (field[1][0] == field[2][0])) &&((field[1][0] == compsimbol) || (field[2][0] == compsimbol))) {
            if (field[0][0] == ' ') {
                field[0][0] = compsimbol;
                return compsimbol;
            }
            if (field[1][0] == ' ') {
                field[1][0] = compsimbol;
                return compsimbol;
            }
            if (field[2][0] == ' ') {
                field[2][0] = compsimbol;
                return compsimbol;
            }
        }
        if (((field[0][1] == field[1][1]) || (field[0][1] == field[2][1]) || (field[1][1] == field[2][1])) &&((field[1][1] == compsimbol) || (field[2][1] == compsimbol))) {
            if (field[0][1] == ' ') {
                field[0][1] = compsimbol;
                return compsimbol;
            }
            if (field[1][1] == ' ') {
                field[1][1] = compsimbol;
                return compsimbol;
            }
            if (field[2][1] == ' ') {
                field[2][1] = compsimbol;
                return compsimbol;
            }
        }
        if (((field[0][2] == field[1][2]) || (field[0][2] == field[2][2]) || (field[1][2] == field[2][2])) &&((field[1][2] == compsimbol) || (field[2][2] == compsimbol))) {
            if (field[0][2] == ' ') {
                field[0][2] = compsimbol;
                return compsimbol;
            }
            if (field[1][2] == ' ') {
                field[1][2] = compsimbol;
                return compsimbol;
            }
            if (field[2][2] == ' ') {
                field[2][2] = compsimbol;
                return compsimbol;
            }
        }//Проверили все столбцы

        if (((field[0][0] == field[1][1]) || (field[0][0] == field[2][2]) || (field[1][1] == field[2][2])) && ((field[0][0] == compsimbol) || (field[1][1] == compsimbol))) {
            if (field[0][0] == ' ') {
                field[0][0] = compsimbol;
                return compsimbol;
            } 
            if (field[1][1] == ' ') {
                field[1][1] = compsimbol;
                return compsimbol;
            }
            if (field[2][2] == ' ') {
                field[2][2] = compsimbol;
                return compsimbol;
            }
        }//Проверили левую диагональ

        if (((field[0][2] == field[1][1]) || (field[0][2] == field[2][0]) || (field[1][1] == field[2][0])) && ((field[0][2] == compsimbol) || (field[1][1] == compsimbol))) {
            if (field[0][2] == ' ') {
                field[0][2] = compsimbol;
                return compsimbol;
            } 
            if (field[1][1] == ' ') {
                field[1][1] = compsimbol;
                return compsimbol;
            }
            if (field[2][0] == ' ') {
                field[2][0] = compsimbol;
                return compsimbol;
            }//Проверили правую диагональ
        }
        // если нет, то ставим в наилучшую позицию
        if (field[1][1] == ' ') {
            field[1][1] = compsimbol;
            return compsimbol;
        }
        if ((field[0][0] == ' ') || (field[2][0] == ' ') || (field[0][2] == ' ') || (field[2][2] == ' ')) {
            if (field[0][0] == ' ') {
                field[0][0] = compsimbol;
                return compsimbol;
            } 
            if (field[2][0] == ' ') {
                field[2][0] = compsimbol;
                return compsimbol;
            } 
            if (field[0][2] == ' ') {
                field[0][2] = compsimbol;
                return compsimbol;
            } 
            if (field[2][2] == ' ') {
                field[2][2] = compsimbol;
                return compsimbol;
            }
        }
        if ((field[1][0] == ' ') || (field[0][1] == ' ') || (field[1][2] == ' ') || (field[2][1] == ' ')) {
            if (field[1][0] == ' ') {
                field[1][0] = compsimbol;
                return compsimbol;
            } 
            if (field[0][1] == ' ') {
                field[0][1] = compsimbol;
                return compsimbol;
            } 
            if (field[1][2] == ' ') {
                field[1][2] = compsimbol;
                return compsimbol;
            } 
            if (field[2][1] == ' ') {
                field[2][1] = compsimbol;
                return compsimbol;
            }
        } 
    return compsimbol;
}

//проверка выигрыша 
int checkWinnings (char elements[3][3], char mansimbol) {   

    bool haswinner = false;
    //проверка первой диагонали      
    if ((elements[0][0] != ' ') && (elements[0][0] == elements[1][1]) && (elements[0][0] == elements[2][2])) {
        //если совпали, то победил тот, чьи это элементы и булл = true   
        if (elements[0][0] == mansimbol) {
            printf("Man has win\n");
            haswinner = true;
        } else {
            printf("Comp has win\n");
            haswinner = true;
        }
    }
    if (!haswinner) {                    
        //проверка второй диагонали
        if ((elements[0][2] != ' ') && (elements[0][2] == elements[1][1]) && (elements[1][1] == elements[2][0])) {
            //если совпали, то победил тот, чьи это элементы и булл = true   
            if (elements[0][2] == mansimbol) {
                printf("Man has win\n");
                haswinner = true;
            } else {
                printf("Comp has win\n");
                haswinner = true;
            }  
        }           
    }
    if (!haswinner) {                    
        //проверка столбцов
        for (int j = 0; j < 3; j++) {
            if ((elements[0][j] != ' ') && (elements[0][j] == elements[1][j]) && (elements[1][j] == elements[2][j])) {
                if (elements[0][j] == mansimbol) {
                    printf("Man has winn\n");
                    haswinner = true;
                    break; 
                } else {
                    printf("Comp has winn\n");
                    haswinner = true;
                    break;
                  } 
             }
        } 
    }
    if (!haswinner) {  
        //проверка строк
        for (int i = 0; i < 3; i++) {
            if ((elements[i][0] != ' ') && (elements[i][0] == elements[i][1]) && (elements[i][0] == elements[i][2])) {
                if (elements [i][0] == mansimbol) {
                    printf("Man has winn\n");
                    haswinner = true;
                    break; 
                } else {
                    printf("Comp has winn\n");
                    haswinner = true;
                    break;
                } 
            }
        }
    }

    return haswinner;
}   

void readFile (char elements[3][3], bool &manCourse, char &mansimbol, char &compsimbol, int &courseCounts) {
//продолжение

    char fileName [100];
    char fullName [200];
    // Путь к сохраненным файлам игр
    char path [100];
    strcpy(path, "/home/school/Projects/");

    //спросить, каким символом мэн играл
    printf("Please, enter your simbol:");
    scanf("%c", &mansimbol);
    if (mansimbol == 'x') {
        compsimbol = 'o'; 
        manCourse = true; 
    } else {
        compsimbol = 'x';
        manCourse = false;
    }

    char answer = 0;
    char answerStr[10];
    printf("Do you want to read a game from file (enter 'y' or 'n'):");
    scanf("%s", answerStr);
    answer = answerStr[0];
    if (answer == 'y') { 
        printf("Please, enter your file name:\n");
        scanf("%s", fileName);
        strcpy(fullName, path);
        strcat(fullName, fileName);
        FILE *file;
        file = fopen(fullName, "rb");
        //выстроить поле, ставя символы из файла на нужные места 
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                fread(&elements[i][j], sizeof(char), 1, file);             
            }
        }
        //если х, то ходить должен он, если число х и о равно, а если число х боьше о,то комп
        int CountX = 0;
        int CountO = 0;
        if (mansimbol == 'x') {
            for(int i = 0; i < 9; i++) {
                for (int j = 0; j < 3; j++) {
                    if (elements[i][j] == 'x') {
                        CountX++;
                    }
                    if (elements[i][j] == 'o') {
                        CountO++;
                    }
                }
            }
            if (CountX == CountO) {
                manCourse = true;
            }
            if (CountX > CountO) {
                manCourse = false;
            }
        }
        //если о, то ходить должен он, если число х больще о, а если число х и о равно, то комп
        if (mansimbol == 'o') {
            if (CountX > CountO) {
                manCourse = true;
            }
            if (CountX == CountO) {
                manCourse = false;
            }
        }
        //колличество ходов равно кол-ву символов
        for (int i = 0; i < 9; i++){
            for (int j = 0; j < 3; j++) {
                if ((elements[i][j] == 'x') || (elements[i][j] == 'o')) {
                    courseCounts++;
                }
            }    
        }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                printf("%c", elements[i][j]);
                printf("|");
            }
            printf("\n");
        }
    }
}  

void saveFile (char field [3][3]) {
    printf("Do you want save your game (enter 'y' or 'n'): \n");
    char answer2Str[10];
    char answer2 = 0;
    char fileName [100];
    char fullName [200];
    char path [100];
    strcpy(path, "/home/school/Projects/");
    scanf("%s", answer2Str);
    answer2 = answer2Str[0];
    if (answer2 == 'y') {
        //переписать все элементы
        FILE *file;
        printf("Please, enter name your file: \n");
        scanf("%s", fileName);
        strcpy(fullName, path);
        strcat(fullName, fileName);
        file = fopen (fullName, "wb");            //адрес
        if (file != NULL) {
            for (int i = 0; i < 3; i++) {
                for(int j = 0; j < 3; j++) {
                    fwrite(&field[i][j], sizeof(char), 1, file);
                }
            }
            fclose (file);
        } else {
            printf("Wrong file name!\n");        
        }
    }
    printf("Your game has been saved. Goodbye\n");
}


int main () {                                        

    srand(time(NULL));
    //булевская переменная для наличия победителя 
    bool haswinner = false;
    //выстраивается поле 3 на 3 (двойной массив в виде таблицы с пустыми клетками вместо элементов)
    char field[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            field[i][j] = ' ';
        }
    }
    //компьютер спрашивает человека, чем он будет играть (далее вместо цифры помещаем в массив х или о)
    char mansimbol = 0;
    char compsimbol = 0;
    bool mansCourse = false; 
    bool manFirst; 
    int y = 0;
    int x = 0;
    int a = 0;
    int b = 0; 
    int ss = 0;
    int courseCounts = 0;//запомнить число ходов: 0
    //цикл, пока поле не кончится или кто-нибудь не победит
    readFile(field, mansCourse, mansimbol, compsimbol, courseCounts);
    while (!haswinner && courseCounts <= 9) {
        //если ход человека, то человек вводит, координаты, куда он хочет поставить знак
        if (mansCourse) {
            //Save (field);
            //спросить, хочет ли человек сохранить игру (далее я рассматриваю случай, когда он ответил да)
            do {
                printf("Please, enter coordinates or '-1 -1' if you want to exit: ");
                scanf("%i %i", &y, &x);
                if ((y == -1) && (x == -1)) {
                    saveFile (field);
                    return 0;     
                }
            } while (field[y][x] != ' ' );
            field[y][x] = mansimbol;
            a = y;
            b = x;
        }
        /*//Вывести игровое поле
        if ((courseCounts != 0) && (mansimbol == 'x')) { 
            printf("\n");
            for (int i = 0; i < 3; i++) {
                printf("|");
                for (int j = 0; j < 3; j++) {
                    printf("%c", field[i][j]);
                    printf("|"); 
                }
                printf("\n");
            }
         }  */ 
        //к числу ходов прибавить 1
        courseCounts++;
        //проверка выигрыша
        haswinner = checkWinnings(field, mansimbol);
        //если поле не кончилось, то компьютер рандомно ставит свой знак
        if (courseCounts != 9 && haswinner == false) {
            /*do { 
                y = rand () % 3;
                x = rand () % 3;
            } while (field[y][x] != ' ');*/
            SmartMove (field, mansimbol, compsimbol);
            //field[y][x] = compsimbol;
        }                
        mansCourse = true;
        //к числу ходов прибавить 1   
        courseCounts++;
        //Вывести игровое поле
        if (haswinner == false) {
            printf("\n");
            for (int i = 0; i < 3; i++) {
                printf("|");
                for (int j = 0; j < 3; j++) {
                    printf("%c", field[i][j]);
                    printf("|"); 
                }
                printf("\n");
            }
        }
        //проверка выигрыша и выход из цикла, если кто-то выиграл
        if (haswinner == false) {
            haswinner = checkWinnings(field, mansimbol);
        }    
    }
    if (haswinner == false) {
        printf("No one won\n");
    }
    return 0;
} 
            
            
            
            
            
            
            
            

